/*
 Problem Description
　　给定一个m × n (m行, n列)的迷宫，迷宫中有两个位置，gloria想从迷宫的一个位置走到另外一个位置，
当然迷宫中有些地方是空地，gloria可以穿越，有些地方是障碍，她必须绕行，从迷宫的一个位置，
只能走到与它相邻的4个位置中,当然在行走过程中，gloria不能走到迷宫外面去。
令人头痛的是，gloria是个没什么方向感的人，因此，她在行走过程中，不能转太多弯了，否则她会晕倒的。
我们假定给定的两个位置都是空地，初始时，gloria所面向的方向未定，她可以选择4个方向的任何一个出发，
而不算成一次转弯。gloria能从一个位置走到另外一个位置吗？
 
Input
　　第1行为一个整数t (1 ≤ t ≤ 100),表示测试数据的个数，接下来为t组测试数据，每组测试数据中，
　　第1行为两个整数m, n (1 ≤ m, n ≤ 100),分别表示迷宫的行数和列数，接下来m行，每行包括n个字符，
其中字符'.'表示该位置为空地，字符'*'表示该位置为障碍，输入数据中只有这两种字符，
每组测试数据的最后一行为5个整数k, x1, y1, x2, y2 (1 ≤ k ≤ 10, 1 ≤ x1, x2 ≤ n, 1 ≤ y1, y2 ≤ m),
其中k表示gloria最多能转的弯数，(x1, y1), (x2, y2)表示两个位置，其中x1，x2对应列，y1, y2对应行。
 
Output
　　每组测试数据对应为一行，若gloria能从一个位置走到另外一个位置，输出“yes”，否则输出“no”。
 
Sample Input
2
5 5
...**
 *.**.
.....
.....
 *....
1 1 1 1 3
5 5
...**
 *.**.
.....
.....
 *....
2 1 1 1 3
 
Sample Output
no
yes
 */
package com.yuan.algorithms.acm201504;

import java.util.Scanner;

public class HD1728逃离迷宫 {

	static int m, n, endX, endY;
	static char[][] map;
	static boolean result;// 记录结果

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			int t = sc.nextInt();
			for (int i = 0; i < t; i++) {
				result = false;//初始化结果为false
				m = sc.nextInt();
				n = sc.nextInt();
				map = new char[m][n];//创建地图
				for (int j = 0; j < m; j++) {
					String x = sc.next();
					for (int k = 0; k < n; k++) {
						map[j][k] = x.charAt(k);
					}
				}
				int k = sc.nextInt();// 能转弯的次数
				int startY = sc.nextInt() - 1;// 起点Y坐标
				int startX = sc.nextInt() - 1;// 起点X坐标
				endY = sc.nextInt() - 1;// 终点Y坐标
				endX = sc.nextInt() - 1;// 终点X坐标
				
				dfs(startX, startY, k + 1, 1, 1);//搜索
				
				if (result) {
					System.out.println("yes");
				} else {
					System.out.println("no");
				}
			}
		}
	}

	/**
	 * 使用深搜搜索是否能到达终点
	 * direction记录方向，1,2,3,4分别代表下、右、上、左。
	 * @param startX
	 *            起点X坐标
	 * @param startY
	 *            起点Y坐标
	 * @param k
	 *            剩余转弯的次数
	 * @param directionS
	 *            上一次的方向
	 * @param directionE
	 *            本次搜索的方向
	 */
	private static void dfs(int startX, int startY, int k, int directionS,
			int directionE) {
		if (result) {// 找到结果，终止搜索
			return;
		}
		//判断搜索位置是否越界
		if (startX < 0 || startX >= m || startY < 0 || startY >= n) {
			return;
		}
		//判断当前位置是否可走
		if (map[startX][startY] != '.') {
			return;
		}
		//本次方向和上次搜索的方向不一致，则转弯次数-1
		if (directionE != directionS) {
			k--;
		}
		//转弯次数已经用完
		if (k < 0) {
			return;
		}
		//是否到达终点
		if (startX == endX && startY == endY) {
			result = true;
			return;
		}
		dfs(startX, startY - 1, k, directionE, 1);// 下
		dfs(startX + 1, startY, k, directionE, 2);// 右
		dfs(startX, startY + 1, k, directionE, 3);// 上
		dfs(startX - 1, startY, k, directionE, 4);// 左
	}

}
